home *** CD-ROM | disk | FTP | other *** search
/ FishMarket 1.0 / FishMarket v1.0.iso / fishies / 101-125 / disk_121 / dataplot / fun plots / data_plotter < prev    next >
Text File  |  1992-05-06  |  26KB  |  1,163 lines

  1.  
  2.   '    PC AND AMIGA PLOTTER
  3.   '    BY DALE HOLT, 1 SEPTEMBER 1987
  4.   '    ROUTE 3, BOX 3532
  5.   '    MANCHESTER, TN  37355
  6.  
  7. START:
  8.  IF FRE(0)<25000 THEN  CLEAR ,120000&,4096   'FOR THE AMIGA
  9.  
  10.  MAXPTS=500
  11.  MAXROWS=448/8
  12.  MAXCOLS=448
  13.  MAXCURVES=9
  14.  DIM PLOTARRAY%(MAXROWS,MAXCOLS), DOTMASK%(7)
  15.  DIM X%(MAXPTS,MAXCURVES), Y%(MAXPTS,MAXCURVES)
  16.  DIM PT(MAXPTS,1), SCALEVALUE(1,14), GRIDPOS(1,14)
  17.  DIM PLOTSIZE(1), SCALEMIN(1), SCALEMAX(1), SCALEFAC(1)
  18.  DIM NUMSTEPS(1), LABELWID(1)
  19.  DIM NUMPTS(MAXCURVES), FILENAME$(MAXCURVES)
  20.  DIM SEGMENTS(MAXCURVES), MARKERS(MAXCURVES), YESNO$(1)
  21.  DIM MINVAL(1), MAXVAL(1), XY$(1), LEXP$(1), AXISTYPE$(1)
  22.  
  23.  ' AXIS=0 FOR X AXIS, AXIS=1 FOR Y AXIS
  24.  ' PLOTSIZE(AXIS) = PLOT SIZE IN DOTS
  25.  
  26. PLOTTER:
  27.  'SCREEN 0 : COLOR 2,1       'FOR THE IBM
  28.  CLS
  29.  
  30.  PRINT "DATA PLOTTER V3.0"
  31.  PRINT "COPYRIGHT (C) 1987 by DALE HOLT"
  32.  
  33.  FOR J=0 TO 7 :DOTMASK%(J)=2^J :NEXT
  34.  YESNO$(0)="NO"
  35.  YESNO$(1)="YES"
  36.  XY$(0)="X"
  37.  XY$(1)="Y"
  38.  X=0
  39.  Y=1
  40.  NO=0
  41.  YES=1
  42.  FIRST=YES
  43.  CURVE=0
  44.  SCREENDUMP=NO
  45.  LOG10=LOG(10)
  46.  INTERACTIVE=YES
  47.  GOSUB DEFAULTS
  48.  
  49.  PRINT "The X - Y Plotter Program by Dale Holt."
  50.  PRINT "HELP is available as an OPTION."
  51.  
  52.  NUMOPTS=0
  53.  
  54. MORE:
  55.  LINE INPUT "OPTION? [NONE] ",OPTLINE$
  56.  GOSUB TRIMOPTION
  57.  IF OPTLINE$="" GOTO PROCESS
  58.  GOSUB PROCESSOPTION
  59.  GOTO MORE
  60.  
  61.  
  62. PROCESS:
  63.  PRINT NUMOPTS;"options applied."
  64.  INTERACTIVE=NO
  65.  
  66.  ' ******************************************
  67.  ' *   GET DATA POINT PLOT PARAMETERS       *
  68.  ' ******************************************
  69.  
  70. SCREENPLOT:
  71.  GOSUB NEWFILE      ' GET A FILE OF DATA
  72.  
  73.  IF FIRST=YES THEN
  74.    T1=TIMER
  75.    W=500*XFACTOR
  76.    H=160*YFACTOR
  77.    PLOTSIZE(X)=W-1
  78.    PLOTSIZE(Y)=H-1
  79.  END IF
  80.  
  81.  IF FIRST=YES THEN GOSUB XMAX
  82.  
  83.  GOSUB SCALE
  84.  
  85.  T2=TIMER-T1
  86.  PRINT "Plot calculations fininshed in ";T2;" seconds."
  87.  
  88.  'SCREEN SCRMODE      'FOR THE IBM
  89.  CLS
  90.  
  91.    IF NUMERICS=YES THEN
  92.    
  93.    ' PRINT Y GRID VALUES
  94.      FOR J=0 TO NUMSTEPS(Y)
  95.        PARM$=STR$(SCALEVALUE(Y,J))
  96.        GOSUB TRIMSTR
  97.        PARM$=LEXP$(Y)+PARM$
  98.        LOCATE 22-J*20/NUMSTEPS(Y),(10-LEN(PARM$))*XFACTOR
  99.        PRINT PARM$; 
  100.      NEXT
  101.  
  102.      ' PRINT X GRID VALUES
  103.      LOCATE 23,12*XFACTOR
  104.      PARM$=STR$(SCALEVALUE(X,0))
  105.      GOSUB TRIMSTR
  106.      PARM$=LEXP$(X)+PARM$
  107.      PRINT PARM$;  ' X MIN
  108.      PARM$=STR$(SCALEVALUE(X,NUMSTEPS(X)))
  109.      GOSUB TRIMSTR
  110.      PARM$=LEXP$(X)+PARM$
  111.      LOCATE 23,(76-LEN(PARM$))*XFACTOR
  112.      PRINT PARM$;  ' X MAX
  113.    END IF
  114.  
  115.    ' DRAW THE GRIDS
  116.    IF GRIDS=YES THEN
  117.      XOFF=100*XFACTOR
  118.      YOFF=170*YFACTOR
  119.      XE=GRIDPOS(X,NUMSTEPS(X))
  120.      YE=GRIDPOS(Y,NUMSTEPS(Y))
  121.      FOR J=0 TO NUMSTEPS(Y)       ' HORIZONTAL LINES
  122.        LINE (XOFF+2,YOFF-GRIDPOS(Y,J))-(XOFF+XE,YOFF-GRIDPOS(Y,J)),2
  123.      NEXT
  124.  
  125.      FOR J=0 TO NUMSTEPS(X)       ' VERTICAL LINES
  126.        LINE (XOFF+GRIDPOS(X,J),YOFF-2)-(XOFF+GRIDPOS(X,J),YOFF-YE),2
  127.      NEXT
  128.    END IF
  129.  
  130.    LOCATE 1,(45-LEN(TITLE$)/2)*XFACTOR
  131.    PRINT TITLE$;
  132.  
  133.    LOCATE 1,10*XFACTOR
  134.    PRINT YLABEL$;
  135.  
  136.    LOCATE 23,(45-LEN(XLABEL$)/2)*XFACTOR
  137.    PRINT XLABEL$;
  138.  
  139.    LINE (94*XFACTOR,7*YFACTOR)-(608*XFACTOR,174*YFACTOR),1,B :' PLOT BOX
  140.  
  141.   ' DRAW THE CURVE
  142.   TINT=3  ' FOR THE AMIGA
  143.   XOFFSET=100*XFACTOR
  144.   YOFFSET=170*YFACTOR
  145.   FOR CURV=0 TO CURVES
  146.     'TINT=14-CURV       ' FOR THE IBM PC
  147.     IF SEGMENTS(CURV)=YES THEN
  148.       PSET (XOFFSET+X%(1,CURV),YOFFSET-Y%(1,CURV)),TINT
  149.       FOR J=2 TO NUMPTS(CURV)
  150.         LINE -(XOFFSET+X%(J,CURV),YOFFSET-Y%(J,CURV)),TINT
  151.       NEXT
  152.     END IF
  153.  
  154.     ' MARK THE DATA POINTS
  155.     IF MARKERS(CURV)=YES THEN
  156.       BOXSIZE=1
  157.       XL=XOFFSET-1
  158.       XH=XOFFSET+1
  159.       YL=YOFFSET+1    :'   Y IS COUNTED FROM THE TOP DOWN!
  160.       YH=YOFFSET-1
  161.       FOR J=1 TO NUMPTS(CURV)
  162.         LINE (XL+X%(J,CURV),YL-Y%(J,CURV))-(XH+X%(J,CURV),YH-Y%(J,CURV)),TINT,B
  163.       NEXT
  164.     END IF
  165.   NEXT
  166.  
  167.  FIRST=NO
  168.  
  169. ANOTH:
  170.  LOCATE 22,1
  171.  PRINT "Add";
  172.  LOCATE 23,1
  173.  INPUT "Curve[N]? ",A$
  174.  IF A$="" THEN A$="N"
  175.  A$=CHR$(ASC(LEFT$(A$,1)) AND 95)
  176.  IF A$="Y" THEN
  177.    CURVE=CURVE+1
  178.    CURVES=CURVES+1
  179.    GOTO SCREENPLOT
  180.  END IF
  181.  IF A$<>"N" THEN BEEP : GOTO ANOTH
  182.    
  183.  LOCATE 23,1
  184.  INPUT "Print[N]?",A$
  185.  IF A$="" THEN END
  186. 'A$=CHR$(ASC(LEFT$(A$,1)) AND 95)       'FOR IBM
  187.  A$=UCASE$(A$) 'FOR AMIGA
  188.  IF A$="N" THEN END
  189.  IF A$<>"Y" THEN
  190.    LOCATE 23,1
  191.    PRINT "INVALID!  ";: BEEP
  192.    GOTO ANOTH
  193.  END IF
  194.  
  195.  SCREENDUMP=YES
  196.  DEVICE$="PRINTER"
  197.  FIRST=YES
  198.  CURVE=0
  199.  T1=TIMER
  200. ' SCREEN 0 : COLOR 2,1      ' FOR THE IBM
  201.  CLS
  202.  
  203. PRINTERPLOT:
  204.  
  205.  IF T1=0 THEN T1=TIMER
  206.  GOSUB NEWFILE           ' GET A FILE OF DATA
  207.  
  208.  '**************************************
  209.  '*   GET PLOT POSITION VALUES         *
  210.  '**************************************
  211.  
  212. PW:
  213.  INPUT "Plot Width in cm (4.5-18) [18]?",W
  214.  IF W=0 THEN W=18
  215.  W=INT(W*23.6)     :' 23.6 DOTS PER CM
  216.  IF (W<100) OR (W>448) THEN PRINT "INVALID! "; :BEEP :GOTO PW
  217.  
  218. PH:
  219.  INPUT "Plot Height in cm (4.5-16) [16]? ",H
  220.  IF H=0 THEN H=16
  221.  H=INT(H*28.3)     :' 28.3 DOTS PER CM
  222.  IF (H<100) OR (H>452) THEN PRINT "INVALID! "; :BEEP :GOTO PH
  223.  HM=INT(H/8)
  224.  H=HM*8
  225.  WM=W+1
  226.  
  227.  PLOTSIZE(X)=W-1
  228.  PLOTSIZE(Y)=H-1
  229.  
  230. XM:
  231.  GOSUB XMAX      ' FIND MAX AND MIN, THEN SCALE THE AXIS
  232.  GOSUB SCALE
  233.  
  234.  IF W<=472-LABELWID(X)*6 GOTO LMSET
  235.  W=472-LABELWID(X)*6  :' WIDTH MUST BE MADE SMALLER
  236.  GOTO XM
  237.  
  238. LMSET:
  239.  LX=INT((472-W)/6)-LABELWID(X)
  240.  IF LX<1 GOTO DRAWCURVE
  241.  PRINT "Left Margin in characters (0 -";LX;") [0]";
  242.  INPUT " ",LN
  243.  LN=INT(LN)
  244.  IF (LN<0) OR (LN>LX) THEN PRINT "INVALID! "; :BEEP :GOTO LMSET
  245.  LM=LN+LABELWID(X)
  246.  
  247. DRAWGRIDS:
  248.  IF GRIDS=YES THEN
  249.    PRINT "Drawing the grids."
  250.    FOR J=0 TO NUMSTEPS(Y)
  251.      R=GRIDPOS(Y,J)
  252.      FOR C=1 TO W STEP 3
  253.        GOSUB POINTON
  254.      NEXT
  255.    NEXT
  256.  
  257.    FOR J=0 TO NUMSTEPS(X)
  258.      C=GRIDPOS(X,J)
  259.      FOR R=1 TO H STEP 3
  260.        GOSUB POINTON
  261.      NEXT
  262.    NEXT
  263.  END IF
  264.  
  265. DRAWCURVE:
  266.  PRINT
  267.  PRINT
  268.  LOCATE 22,1
  269.  PRINT "Drawing line segment:          of";NUMPTS(CURVE)-1;
  270.  PRINT "for curve ";CURVE+1
  271.  IF SEGMENTS(CURVE)=YES THEN
  272.    XBEGIN=X%(1,CURVE)
  273.    YBEGIN=Y%(1,CURVE)
  274.    FOR J=2 TO NUMPTS(CURVE)
  275.      LOCATE 22,22
  276.      PRINT J-1;
  277.      XEN=X%(J,CURVE)
  278.      YEN=Y%(J,CURVE)
  279.      GOSUB DRAWLINE
  280.    NEXT
  281.    PRINT
  282.    PRINT
  283.  END IF
  284.  
  285.  IF MARKERS(CURVE)=YES THEN
  286.    FOR J=1 TO NUMPTS(CURVE)
  287.      XBEGIN=X%(J,CURVE)
  288.      YBEGIN=Y%(J,CURVE)
  289.      GOSUB MARKER
  290.    NEXT
  291.  END IF
  292.  
  293.  IF SCREENDUMP=YES AND CURVE<CURVES THEN
  294.    FIRST=NO
  295.    CURVE=CURVE+1
  296.    GOSUB NEWFILE         ' GET NEXT DATA FILE
  297.    GOSUB SCALE
  298.    GOTO DRAWCURVE
  299.  END IF
  300.  SCREENDUMP=NO
  301.  
  302.  
  303. ANOTHER:
  304.  IF CURVES<MAXCURVES THEN
  305.    INPUT "Overlay another curve [N]? ",A$
  306.    IF A$="" THEN A$="N"
  307.    A$=CHR$(ASC(LEFT$(A$,1)) AND 95)
  308.    IF A$="Y" THEN
  309.      CURVE=CURVE+1
  310.      CURVES=CURVES+1
  311.      GOTO PRINTERPLOT
  312.    END IF
  313.    IF A$="N" GOTO PRINTPLOT
  314.    PRINT "INVALID!  ";
  315.    BEEP
  316.    GOTO ANOTHER
  317.  END IF
  318.  
  319.  ' **********************************
  320.  ' *        START THE PLOT          *
  321.  ' **********************************
  322.  
  323. PRINTPLOT:
  324.  PRINT: PRINT "Printing the plot of ";TITLE$
  325.  
  326.  OPEN "PAR:" FOR OUTPUT AS #1     ' FOR AMIGA
  327.  'OPEN "LPT1:" FOR OUTPUT AS #1    ' FOR IBM
  328.  WIDTH #1,255
  329.  
  330.  C=INT(LM+W/12-LEN(TITLE$)*.5)
  331.  IF (C+LEN(TITLE$))>80 THEN C=80-LEN(TITLE$)
  332.  PRINT #1,SPC(C);TITLE$
  333.  PRINT #1,""
  334.  PRINT #1,SPC(LM-4);YLABEL$ :' Y AXIS LABEL
  335.  
  336.  PRINT
  337.  PRINT
  338.  LOCATE 23,1
  339.  PRINT "Lines left to print: ";
  340.  
  341.  ' ***************************************************
  342.  ' *           SEND MX 80 ESCAPE SEQUENCE            *
  343.  ' ***************************************************
  344.  PRINT #1,GLFDOTS$; :' (8) DOTS PER LF
  345.  DW=W+8
  346.  IF DW>255 THEN N2=INT(DW/256)
  347.  N1=DW-N2*256
  348.  DW$=CHR$(27)+CHR$(75)+CHR$(N1)+CHR$(N2)
  349.  PRINT #1,SPC(LM);DW$;CHR$(15);CHR$(15);
  350.  FOR J=1 TO W+4
  351.   PRINT #1,CHR$(12);
  352.  NEXT
  353.  PRINT #1,CHR$(15);CHR$(15)
  354.  YGRID=NUMSTEPS(Y)
  355.  FOR J=HM-1 TO 0 STEP -1
  356.    LOCATE 23,23
  357.    PRINT J+1;
  358.    IF NUMERICS=YES AND J<=GRIDPOS(Y,YGRID)/8 THEN
  359.      PARM$=STR$(SCALEVALUE(1,YGRID))
  360.      GOSUB TRIMSTR
  361.      PARM$=LEXP$(Y)+PARM$
  362.      PRINT #1,SPC(LM-1-LEN(PARM$));
  363.      PRINT #1,PARM$;" ";
  364.      YGRID=YGRID-1
  365.    ELSE
  366.      PRINT #1,SPC(LM);
  367.    END IF
  368.    PRINT #1,DW$;CHR$(255);CHR$(255);CHR$(0);CHR$(0);
  369.    FOR N=1 TO W
  370.      PRINT #1,CHR$(PLOTARRAY%(J,N));
  371.    NEXT
  372.    PRINT #1,CHR$(0);CHR$(0);CHR$(255);CHR$(255)
  373.  NEXT
  374.  PRINT #1,SPC(LM);DW$;CHR$(240);CHR$(240);
  375.  FOR J=1 TO W+4
  376.    PRINT #1,CHR$(48);
  377.  NEXT
  378.  PRINT #1,CHR$(240);CHR$(240)
  379.  
  380.  SC=0
  381.  IF NUMERICS=YES THEN
  382.    FOR J=0 TO NUMSTEPS(X)-1
  383.      PARM$=STR$(SCALEVALUE(X,J))
  384.      GOSUB TRIMSTR
  385.      PARM$=LEXP$(X)+PARM$
  386.      C=LM+GRIDPOS(X,J)/6-LEN(PARM$)/2
  387.      PRINT #1,SPC(C-SC);PARM$;
  388.      SC=C+LEN(PARM$)
  389.    NEXT
  390.    PARM$=STR$(SCALEVALUE(X,NUMSTEPS(X)))
  391.    GOSUB TRIMSTR
  392.    PARM$=LEXP$(X)+PARM$
  393.    C=LM+GRIDPOS(X,NUMSTEPS(X))/6-LEN(PARM$)
  394.    PRINT #1,SPC(C-SC);PARM$;
  395.  END IF
  396.  PRINT #1,NLFDOTS$  ' RESET PRINTER (DOTS PER LF)
  397.  C=INT(LM+W/12+.5-LEN(XLABEL$)*.5)
  398.  IF (C+LEN(XLABEL$))>80 THEN C=80-LEN(XLABEL$)
  399.  PRINT #1,SPC(C);XLABEL$ ' X AXIS LABEL
  400.  PRINT #1,"" : PRINT #1,"": PRINT #1,""
  401.  CLOSE #1
  402.  BEEP
  403.  T2=TIMER-T1
  404.  PRINT
  405.  PRINT "Plot finished in ";T2;" seconds."
  406.  END
  407.  
  408.  
  409.  
  410.  ' *********************************
  411.  ' *       SUBROUTINES             *
  412.  ' *********************************
  413.  
  414.  
  415. NEWFILE:
  416.  
  417.  IF SCREENDUMP=YES THEN
  418.    DATAFILE$=FILENAME$(CURVE)
  419.  ELSE
  420.    INPUT "Disk Data File [DATA, (?path for files)]? ",DATAFILE$
  421.    IF DATAFILE$="" THEN DATAFILE$="DATA"
  422.    FILENAME$(CURVE)=DATAFILE$
  423.  
  424.    IF LEFT$(DATAFILE$,1)="?" THEN
  425.      FILES RIGHT$(DATAFILE$,LEN(DATAFILE$)-1)
  426.      GOTO NEWFILE
  427.    END IF
  428.  END IF
  429.  
  430.  ON ERROR GOTO NOFILE
  431.  OPEN DATAFILE$ FOR INPUT AS #1
  432.  ON ERROR GOTO 0
  433.  
  434.  PRINT "Reading file ";DATAFILE$
  435.  
  436.  NUMOPTS=0
  437.  OPTLINES=0
  438. OPTIONLINE:
  439.  IF EOF(1) THEN            ' FILE MAY ONLY CONTAIN OPTION
  440.    PRINT NUMOPTS;"options applied."
  441.    CURVES=CURVES+1
  442.    CURVE=CURVE+1
  443.    GOTO NEWFILE
  444.  END IF
  445.  LINE INPUT #1,OPTLINE$
  446.  IF ECHO=YES THEN PRINT OPTLINE$
  447.  GOSUB TRIMOPTION
  448.  FC$=LEFT$(OPTLINE$,1)             ' FIRST CHARACTER
  449.  IF FC$="-" OR FC$="+" OR FC$="." OR (FC$=>"0" AND FC$<="9") GOTO READFILE
  450.  GOSUB PROCESSOPTION
  451.  OPTLINES=OPTLINES+1
  452.  GOTO OPTIONLINE
  453.  
  454.  
  455. READFILE:
  456.  PRINT NUMOPTS;"options applied."
  457.  
  458.  CLOSE #1
  459.  OPEN DATAFILE$ FOR INPUT AS #1
  460.  
  461.  FOR J=1 TO OPTLINES              ' SKIP OPTION LINES THIS TIME
  462.    LINE INPUT #1,OPTLINE$
  463.  NEXT J
  464.  
  465.  NUMPTS=0
  466.  IF XCOL=0 THEN
  467.    C1=0
  468.    C2=1
  469.  ELSE
  470.    C1=1
  471.    C2=0
  472.  END IF
  473.  
  474.  WHILE NOT EOF(1)
  475.  
  476.    NUMPTS=NUMPTS+1
  477.    IF DATATYPE$="X,Y" THEN INPUT #1,PT(NUMPTS,C1),PT(NUMPTS,C2)
  478.    IF DATATYPE$="UNIFORM" THEN INPUT #1,PT(NUMPTS,Y): PT(NUMPTS,X)=NUMPTS
  479.    IF ECHO=YES THEN PRINT PT(NUMPTS,X);TAB(12);PT(NUMPTS,Y)
  480.    
  481.  WEND
  482.  
  483.  NUMPTS(CURVE)=NUMPTS
  484.  
  485.  CLOSE #1
  486.  
  487.  PRINT
  488.  PRINT "Data points read:";NUMPTS
  489.  
  490.  RETURN
  491.  
  492. NOFILE:
  493.   PRINT "File ";FILENAME$;" cannot be opened!"
  494.   BEEP
  495.   IF SCREENDUMP=YES THEN
  496.     PRINT "Cannot continue with the plot.  File is gone."
  497.     SCREENDUMP=NO
  498.   END IF
  499.   RESUME NEWFILE
  500.  
  501. XMAX:
  502.  ' FIND X MAX AND MIN
  503.  LOW=PT(1,X)
  504.  HIGH=LOW
  505.  FOR J=1 TO NUMPTS(CURVE)
  506.    IF PT(J,X)<LOW THEN LOW=PT(J,X)
  507.    IF PT(J,X)>HIGH THEN HIGH=PT(J,X)
  508.  NEXT
  509.  
  510. XSCALE:
  511.  ' DETERMINE SCALE FOR X AXIS
  512.  IF FIRST=YES THEN
  513.    AXIS=X
  514.    NSTEPS=INT((W+1)/40)
  515.    IF DEVICE$="SCREEN" THEN NSTEPS=NSTEPS/2
  516.    PRINT
  517.    GOSUB SCALEAXIS
  518.  END IF
  519.  
  520. YMAX:
  521.  ' FIND Y MAX AND MIN
  522.  LOW=PT(1,Y)
  523.  HIGH=LOW
  524.  FOR J=1 TO NUMPTS(CURVE)
  525.    IF PT(J,Y)<LOW THEN LOW=PT(J,Y)
  526.    IF PT(J,Y)>HIGH THEN HIGH=PT(J,Y)
  527.  NEXT
  528.  
  529. YSCALE:
  530.  ' DETERMINE SCALE FOR Y AXIS
  531.  IF FIRST=YES THEN
  532.    AXIS=Y
  533.    NSTEPS=INT(H/45)
  534.    GOSUB SCALEAXIS
  535.  END IF
  536.  
  537.  RETURN
  538.  
  539. SCALE:
  540.  PRINT "Scaling the values for curve ";CURVE+1
  541.  ' SCALE VALUES TO NUMBER OF DOTS
  542.  IF AXISTYPE$(X)="LOG" THEN
  543.    FOR J=1 TO NUMPTS(CURVE)
  544.      PT(J,X)=LOG(PT(J,X))/LOG10
  545.    NEXT J
  546.  END IF
  547.  IF AXISTYPE$(Y)="LOG" THEN
  548.    FOR J=1 TO NUMPTS(CURVE)
  549.      PT(J,Y)=LOG(PT(J,Y))/LOG10
  550.    NEXT J
  551.  END IF
  552.  FOR J=1 TO NUMPTS(CURVE)
  553.    X%(J,CURVE)=INT((PT(J,X)-SCALEMIN(X))*SCALEFAC(X)+1)
  554.    Y%(J,CURVE)=INT((PT(J,Y)-SCALEMIN(Y))*SCALEFAC(Y)+1)
  555.  NEXT
  556.  
  557.  IF DEVICE$="SCREEN" THEN
  558.    FOR J=1 TO NUMPTS(CURVE)
  559.      IF X%(J,CURVE)<0 THEN X%(J,CURVE)=1
  560.      IF X%(J,CURVE)>W THEN X%(J,CURVE)=W-2
  561.      IF Y%(J,CURVE)<0 THEN Y%(J,CURVE)=1
  562.      IF Y%(J,CURVE)>H THEN Y%(J,CURVE)=H-2
  563.    NEXT
  564.  END IF
  565.  
  566.  RETURN
  567.  
  568.  ' ********************
  569.  ' *   AUTO SCALING   *
  570.  ' ********************
  571.  
  572. SCALEAXIS:
  573.  IF SCALE$="AUTO" THEN
  574.    IF AXISTYPE$(AXIS)="LINEAR" GOTO LINAUTOSCALE
  575.    IF AXISTYPE$(AXIS)="LOG" GOTO LOGAUTOSCALE
  576.  ELSE
  577.    IF AXISTYPE$(AXIS)="LINEAR" GOTO LINMANSCALE
  578.    IF AXISTYPE$(AXIS)="LOG" GOTO LOGMANSCALE
  579.  END IF
  580.  
  581. LOGMANSCALE:
  582.  LOW=MINVAL(AXIS)
  583.  HIGH=MAXVAL(AXIS)
  584.  
  585. LOGAUTOSCALE:
  586.  IF LOW<=0 OR HIGH <=0 THEN
  587.    PRINT "Only positive values can be plotted on a LOG scale!"
  588.    BEEP
  589.    LINE INPUT "Hit RETURN to continue.",A$
  590.    GOTO PLOTTER
  591.  END IF
  592.  LMIN=INT(LOG(LOW)/LOG10)
  593.  LMAX=INT(LOG(HIGH)/LOG10+.9999)
  594.  NS=LMAX-LMIN-1
  595.  IF NS>10 THEN
  596.    LMIN=LMAX-10
  597.    NS=9
  598.    PRINT "RANGE TRUNCATED TO 10 DECADES."
  599.  END IF
  600.  LOW=LMIN
  601.  HIGH=LMAX
  602.  GOTO LINAUTOSCALE
  603.  
  604. LINMANSCALE:
  605.  LOW=MINVAL(AXIS)
  606.  HIGH=MAXVAL(AXIS)
  607.  NS=NSTEPS
  608.  ST=(HIGH-LOW)/NS
  609.  GOTO SETSCALE
  610.  
  611. LINAUTOSCALE:
  612.  IF LOW=HIGH THEN LOW=.9*LOW: HIGH=1.1*HIGH
  613.  IF LOW=HIGH THEN LOW=-1: HIGH=1
  614.  ST=(HIGH-LOW)/NSTEPS
  615.  POWER=0
  616.  WHILE ST<.5
  617.    POWER=POWER-1
  618.    ST=ST*10
  619.  WEND
  620.  WHILE ST>5
  621.    POWER=POWER+1
  622.    ST=ST/10
  623.  WEND
  624.  IF ST<=1 THEN
  625.    FS=1
  626.  ELSEIF ST<=2 THEN
  627.    FS=2
  628.  ELSEIF ST<=3 THEN
  629.    FS=3
  630.  ELSE
  631.    FS=5
  632.  END IF
  633.  ST=(FS)*10^POWER
  634.  ST=VAL(STR$(ST))
  635.  LOLIM=ST*INT(LOW/ST)
  636.  IF LOW<LOLIM THEN LOLIM=LOLIM-ST
  637.  LOW=LOLIM
  638.  HILIM=ST*INT(HIGH/ST)
  639.  IF HIGH > HILIM THEN HILIM=HILIM+ST
  640.  HIGH=HILIM
  641.  NS=INT((HIGH-LOW)/ST+.5)
  642.  
  643. SETSCALE:
  644.  ' PRINT THE STEPS
  645.  PRINT XY$(AXIS);" steps: ";
  646.  LABELWID(AXIS)=0
  647.  FOR J=0 TO NS
  648.  SCALEVALUE(AXIS,J)=LOW+J*ST
  649.  PRINT SCALEVALUE(AXIS,J);
  650.  IF LEN(STR$(SCALEVALUE(AXIS,J)))>LABELWID(AXIS) THEN
  651.    LABELWID(AXIS)=LEN(STR$(SCALEVALUE(AXIS,J)))
  652.  END IF
  653.  NEXT
  654.  PRINT
  655.  PRINT
  656.  SCALEMIN(AXIS)=LOW
  657.  SCALEMAX(AXIS)=HIGH
  658.  NUMSTEPS(AXIS)=NS
  659.  SCALEFAC(AXIS)=(PLOTSIZE(AXIS)-1)/(HIGH-LOW)
  660.  FOR J=0 TO NS
  661.  GRIDPOS(AXIS,J)=1+INT((SCALEVALUE(AXIS,J)-LOW)*SCALEFAC(AXIS)+.5)
  662.  NEXT
  663.  LABELWID(AXIS)=LABELWID(AXIS)+LEN(LEXP$(AXIS))+2
  664.  RETURN
  665.  
  666. DRAWLINE:
  667.  IF XEN=XBEGIN AND YEN=YBEGIN THEN
  668.    C=XBEGIN
  669.    R=YBEGIN
  670.    GOSUB POINTON
  671.  ELSEIF XEN=XBEGIN THEN
  672.    C=XBEGIN
  673.    FOR R=YBEGIN TO YEN STEP SGN(YEN-YBEGIN)
  674.      GOSUB POINTON
  675.    NEXT
  676.  ELSEIF YEN=YBEGIN THEN
  677.    R=YBEGIN
  678.    FOR C=XBEGIN TO XEN STEP SGN(XEN-XBEGIN)
  679.      GOSUB POINTON
  680.    NEXT
  681.  ELSE
  682.    SLOPE=(YEN-YBEGIN)/(XEN-XBEGIN)
  683.    RPAST=INT(YBEGIN)
  684.    FOR C=XBEGIN TO XEN STEP SGN(XEN-XBEGIN)
  685.      R=INT(YBEGIN+SLOPE*(C-XBEGIN)+.5)
  686.      IF R=RPAST THEN
  687.        GOSUB POINTON
  688.      ELSE
  689.        DIRECTION=SGN(R-RPAST)
  690.        RTEMP=R
  691.        FOR R=RPAST TO RTEMP STEP DIRECTION
  692.          GOSUB POINTON
  693.        NEXT
  694.        R=RTEMP
  695.      END IF
  696.      RPAST=R
  697.    NEXT
  698.  END IF
  699.  XBEGIN=XEN
  700.  YBEGIN=YEN
  701.  RETURN
  702.  
  703. POINTON:
  704.  R1=INT(R/8)
  705.  BIT=R-8*R1
  706.  IF R1>-1 AND R1<HM AND C>-1 AND C<WM THEN
  707.    PLOTARRAY%(R1,C)=PLOTARRAY%(R1,C) OR DOTMASK%(BIT)
  708.  END IF
  709.  RETURN
  710.  
  711. MARKER:
  712.  FOR R=YBEGIN-1 TO YBEGIN+1
  713.    FOR C=XBEGIN-1 TO XBEGIN+1
  714.      GOSUB POINTON
  715.    NEXT
  716.  NEXT
  717.  RETURN
  718.  
  719. DEFAULTS:
  720.  XLABEL$="X"
  721.  YLABEL$="Y"
  722.  TITLE$="DATA PLOT"
  723.  SCALE$="AUTO"
  724.  DATATYPE$="X,Y"
  725.  ECHO=NO
  726.  XCOL=0
  727.  YCOL=1
  728.  NUMERICS=YES
  729.  FOR J=0 TO MAXCURVES
  730.    MARKERS(J)=YES
  731.    SEGMENTS(J)=YES
  732.  NEXT J
  733.  AXISTYPE$(X)="LINEAR"
  734.  AXISTYPE$(Y)="LINEAR"
  735.  GRIDS=YES
  736.  MINVAL(X)=.1
  737.  MAXVAL(X)=10
  738.  MINVAL(Y)=.1
  739.  MAXVAL(Y)=10
  740.  LEXP$(X)=""
  741.  LEXP$(Y)=""
  742.  GLFDOTS$=CHR$(27)+"A"+CHR$(8)
  743.  NLFDOTS$=CHR$(27)+"A"+CHR$(11)
  744.  PRTYPE$="MX80"
  745.  GMODE$="MEDIUM, 640 X 200"
  746.  SCRMODE=2     'FOR IBM
  747.  YFACTOR=1
  748.  XFACTOR=1
  749.  DEVICE$="SCREEN"
  750.  RETURN
  751.  
  752. PRINTHELP:
  753.  PRINT
  754.  PRINT "This program plots X,Y data on the screen or on a dot matrix printer"
  755.  PRINT "which is Epson MX-80 or IBM compatible.  The default printer type is"
  756.  PRINT "the Epson MX-80.  The default answers are in square brackets."
  757.  PRINT
  758.  PRINT "The data file consists of any number of option lines followed by"
  759.  PRINT "the data points.  By default, each line of data consists of an X and Y"
  760.  PRINT "value separated by a comma.  The default is also for the first column of data"
  761.  PRINT "to be the X axis values.  The DATA = UNIFORM option permits the data"
  762.  PRINT "to consist of only the Y values, with the X values assumed to be"
  763.  PRINT "uniformly spaced."  
  764.  PRINT
  765.  PRINT "An option line consists of an option name and an option value separated"
  766.  PRINT "by an equal sign.  The spelling of the option can be truncated. "
  767.  PRINT "Upper case is not required.  The option SHOW will result in a display"
  768.  PRINT "of the current values of the options, which are:"
  769.  PRINT
  770.  
  771.  LINE INPUT "Hit RETURN for more...",A$
  772.  
  773.  PRINT
  774.  PRINT "TITLE = string                  (string for plot title)"
  775.  PRINT "XLABEL = string                 (string for X axis label)"
  776.  PRINT "YLABEL = string                 (string for Y axis label)"
  777.  PRINT "PRINTER = IBM or MX80           (sets the escape code for dots/lf)"
  778.  PRINT "MARKERS = YES or NO             (draw a marker for each data point)"
  779.  PRINT "SEGMENTS = YES or NO            (draw line segments between data points)"
  780.  PRINT "XCOLUMN = 0 or 1                (which column has the x values)"
  781.  PRINT "ECHO = YES or NO                (print X - Y data to the screen)"
  782.  PRINT "GRIDS = YES or NO               (draw grid lines)"
  783.  PRINT "REMARK = comment                (ignore this comment line)"
  784.  PRINT "DATA = X,Y or UNIFORM           (data is X,Y or just Y uniformly spaced)"
  785.  PRINT "NUMERICS = YES or NO            (print numbers along the grid axes)"
  786.  PRINT
  787.  
  788.  LINE INPUT "Hit RETURN for more...",A$
  789.  
  790.  PRINT
  791.  PRINT "****** The following options may NOT be set after the first file ******"
  792.  PRINT
  793.  PRINT "SCALE = MANUAL or AUTO          (manual or automatic scaling)"
  794.  PRINT "XMINIMUM = value                (minimum X value for manual scaling)"
  795.  PRINT "XMAXIMUM = value                (maximum X value for manual scaling)"
  796.  PRINT "YMINIMUM = value                (minimum Y value for manual scaling)"
  797.  PRINT "YMAXIMUM = value                (maximum Y value for manual scaling)"
  798.  PRINT "XAXIS = LINEAR or LOGARITHMIC   (X axis type)"
  799.  PRINT "YAXIS = LINEAR or LOGARITHMIC   (Y axis type)"
  800. ' PRINT "SCREEN = LOW, MEDIUM, or HIGH   (set the screen resolution)"
  801. ' PRINT "                                (320x200, 640x200, or 640x350)"
  802.  PRINT
  803.  PRINT "****** The following options may only be set from the keyboard ******"
  804.  PRINT
  805.  PRINT "DEVICE = SCREEN or PRINTER      (put the plot on the screen or printer)"
  806.  PRINT "RESET                           (reset all options to default values)"
  807.  PRINT "HELP                            (print this information)"
  808.  PRINT
  809.  PRINT "Any contribution would be appreciated.  Dale Holt"
  810.  PRINT "    ($10 perhaps?)                      Rt 3 Box 3532"
  811.  PRINT "                                        Manchester, TN 37355"
  812.  RETURN
  813.  
  814. TRIMOPTION:
  815.  PARM$=OPTLINE$
  816.  GOSUB TRIMSTR
  817.  OPTLINE$=PARM$
  818.  RETURN
  819.  
  820. PROCESSOPTION:
  821.  IF OPTLINE$="" THEN RETURN
  822.  OPTIONVAL$=""
  823.  PC=INSTR(OPTLINE$,"=")
  824.  IF PC=0 THEN
  825.    OPTIONVAL$=""
  826.  ELSE
  827.    OPTIONVAL$=MID$(OPTLINE$,PC+1,LEN(OPTLINE$))
  828.    OPTLINE$=LEFT$(OPTLINE$,PC-1)
  829.    WHILE RIGHT$(OPTLINE$,1)=" "
  830.      OPTLINE$=LEFT$(OPTLINE$,LEN(OPTLINE$)-1)
  831.    WEND
  832.    WHILE LEFT$(OPTIONVAL$,1)=" "
  833.      OPTIONVAL$=RIGHT$(OPTIONVAL$,LEN(OPTIONVAL$)-1)
  834.    WEND
  835.  END IF
  836.  LO=LEN(OPTLINE$)
  837.  IF LO=0 THEN LO=1
  838.  LOV=LEN(OPTIONVAL$)
  839.  IF LOV=0 THEN LOV=1
  840.  
  841.  TEMP$=""       ' CONVERT OPTION TO UPPER CASE
  842.  FOR L=1 TO LO
  843.    C$=MID$(OPTLINE$,L,1)                   
  844.    IF C$=>"a" AND C$<="z" THEN C$=CHR$(ASC(C$) AND 95)  'FOR IBM
  845.    C$=UCASE$(C$)
  846.    TEMP$=TEMP$+C$
  847.  NEXT
  848.  OPTLINE$=TEMP$
  849.  
  850.  TEMP$=""       ' CONVERT OPTION VALUE TO UPPER CASE
  851.  LCOPTIONVAL$=OPTIONVAL$      'SAVE LOWERCASE VALUE
  852.  FOR L=1 TO LOV
  853.    C$=MID$(OPTIONVAL$,L,1)
  854.  ' IF C$=>"a" AND C$<="z" THEN C$=CHR$(ASC(C$) AND 95)   'IBM
  855.    C$=UCASE$(C$)  'AMIGA
  856.    TEMP$=TEMP$+C$
  857.  NEXT
  858.  OPTIONVAL$=TEMP$
  859.  
  860.  
  861.  IF OPTLINE$=LEFT$("TITLE",LO) THEN
  862.    TITLE$=LCOPTIONVAL$
  863.    NUMOPTS=NUMOPTS+1
  864.    RETURN
  865.  END IF
  866.  
  867.  IF OPTLINE$=LEFT$("XLABEL",LO) THEN
  868.    XLABEL$=LCOPTIONVAL$
  869.    NUMOPTS=NUMOPTS+1
  870.    RETURN
  871.  END IF
  872.  
  873.  IF OPTLINE$=LEFT$("YLABEL",LO) THEN
  874.    YLABEL$=LCOPTIONVAL$
  875.    NUMOPTS=NUMOPTS+1
  876.    RETURN
  877.  END IF
  878.  
  879.  IF OPTLINE$=LEFT$("MARKERS",LO) THEN
  880.    IF OPTIONVAL$=LEFT$("YES",LOV) THEN
  881.      MARKERS(CURVE)=YES
  882.      NUMOPTS=NUMOPTS+1
  883.    ELSEIF OPTIONVAL$=LEFT$("NO",LOV) THEN
  884.      MARKERS(CURVE)=NO
  885.      NUMOPTS=NUMOPTS+1
  886.    ELSE
  887.      GOTO OPTIONERR
  888.    END IF
  889.    RETURN
  890.  END IF
  891.  
  892.  IF OPTLINE$=LEFT$("DATA",LO) THEN
  893.    IF OPTIONVAL$=LEFT$("X,Y",LOV) THEN
  894.      DATATYPE$="X,Y"
  895.      NUMOPTS=NUMOPTS+1
  896.    ELSEIF OPTIONVAL$=LEFT$("UNIFORM",LOV) THEN
  897.      DATATYPE$="UNIFORM"
  898.      NUMOPTS=NUMOPTS+1
  899.    ELSE
  900.      GOTO OPTIONERR
  901.    END IF
  902.    RETURN
  903.  END IF
  904.  
  905.  IF OPTLINE$=LEFT$("NUMERICS",LO) THEN
  906.    IF OPTIONVAL$=LEFT$("YES",LOV) THEN
  907.      NUMERICS=YES
  908.      NUMOPTS=NUMOPTS+1
  909.    ELSEIF OPTIONVAL$=LEFT$("NO",LOV) THEN
  910.      NUMERICS=NO
  911.      NUMOPTS=NUMOPTS+1
  912.    ELSE
  913.      GOTO OPTIONERR
  914.    END IF
  915.    RETURN
  916.  END IF
  917.  
  918.  IF OPTLINE$=LEFT$("PRINTER",LO) THEN
  919.    IF OPTIONVAL$=LEFT$("MX80",LOV) THEN
  920.      GLFDOTS$=CHR$(27)+"A"+CHR$(8)
  921.      NLFDOTS$=CHR$(27)+"A"+CHR$(11)
  922.      PRTYPE$="MX80"
  923.      NUMOPTS=NUMOPTS+1
  924.    ELSEIF OPTIONVAL$=LEFT$("IBM",LOV) THEN
  925.      GLFDOTS$=CHR$(27)+"A"+CHR$(8)+CHR$(27)+"2"
  926.      NLFDOTS$=CHR$(27)+"A"+CHR$(11)+CHR$(27)+"2"
  927.      PRTYPE$="IBM"
  928.      NUMOPTS=NUMOPTS+1
  929.    ELSE
  930.      GOTO OPTIONERR
  931.    END IF
  932.    RETURN
  933.  END IF
  934.  
  935.  IF OPTLINE$=LEFT$("ECHO",LO) THEN
  936.    IF OPTIONVAL$=LEFT$("YES",LOV) THEN
  937.      ECHO=YES
  938.      NUMOPTS=NUMOPTS+1
  939.    ELSEIF OPTIONVAL$=LEFT$("NO",LOV) THEN
  940.      ECHO=NO
  941.      NUMOPTS=NUMOPTS+1
  942.    ELSE
  943.      GOTO OPTIONERR
  944.    END IF
  945.    RETURN
  946.  END IF
  947.  
  948.  IF OPTLINE$=LEFT$("SEGMENTS",LO) THEN
  949.    IF OPTIONVAL$=LEFT$("YES",LOV) THEN
  950.      SEGMENTS(CURVE)=YES
  951.      NUMOPTS=NUMOPTS+1
  952.    ELSEIF OPTIONVAL$=LEFT$("NO",LOV) THEN
  953.      SEGMENTS(CURVE)=NO
  954.      NUMOPTS=NUMOPTS+1
  955.    ELSE
  956.      GOTO OPTIONERR
  957.    END IF
  958.    RETURN
  959.  END IF
  960.  
  961.  IF OPTLINE$=LEFT$("XCOLUMN",LO) THEN
  962.    IF OPTIONVAL$="0" THEN
  963.      XCOL=0
  964.      YCOL=1
  965.      NUMOPTS=NUMOPTS+1
  966.    ELSEIF OPTIONVAL$="1" THEN
  967.      XCOL=1
  968.      YCOL=0
  969.      NUMOPTS=NUMOPTS+1
  970.    ELSE
  971.      GOTO OPTIONERR
  972.    END IF
  973.    RETURN
  974.  END IF
  975.  
  976.  IF OPTLINE$=LEFT$("REMARK",LO) THEN
  977.    RETURN
  978.  END IF
  979.  
  980.  IF OPTLINE$=LEFT$("GRIDS",LO) THEN
  981.    IF OPTIONVAL$=LEFT$("YES",LOV) THEN
  982.      GRIDS=YES
  983.      NUMOPTS=NUMOPTS+1
  984.    ELSEIF OPTIONVAL$=LEFT$("NO",LOV) THEN
  985.      GRIDS=NO
  986.      NUMOPTS=NUMOPTS+1
  987.    ELSE
  988.      GOTO OPTIONERR
  989.    END IF
  990.    RETURN
  991.  END IF
  992.  
  993.  IF OPTLINE$=LEFT$("SHOW",LO) THEN
  994.    PRINT
  995.    PRINT "The options are set as follows:"
  996.    PRINT "PRINTER = ";PRTYPE$
  997.    PRINT "SCREEN = ";GMODE$
  998.    PRINT "DEVICE = ";DEVICE$
  999.    PRINT "TITLE = ";TITLE$
  1000.    PRINT "XLABEL = ";XLABEL$
  1001.    PRINT "YLABEL = ";YLABEL$
  1002.    PRINT "SCALE = ";SCALE$
  1003.    PRINT "XCOLUMN = ";XCOL
  1004.    PRINT "YCOLUMN = ";YCOL
  1005.    PRINT "XAXIS = ";AXISTYPE$(X)
  1006.    PRINT "YAXIS = ";AXISTYPE$(Y)
  1007.    PRINT "GRIDS = ";YESNO$(GRIDS)
  1008.    PRINT "ECHO = ";YESNO$(ECHO)
  1009.    PRINT "DATA = ";DATATYPE$
  1010.    PRINT "NUMERICS = ";YESNO$(NUMERICS)
  1011.    PRINT "XMINIMUM = ";MINVAL(X)
  1012.    PRINT "XMAXIMUM = ";MAXVAL(X)
  1013.    PRINT "YMINIMUM = ";MINVAL(Y)
  1014.    PRINT "YMAXIMUM = ";MAXVAL(Y)
  1015.    PRINT
  1016.    
  1017.    LINE INPUT "Hit <ENTER> to continue...",A$
  1018.    
  1019.    PRINT
  1020.    FOR J=0 TO MAXCURVES
  1021.      PRINT "MARKERS (CURVE=";J+1;") = ";YESNO$(MARKERS(J))
  1022.      PRINT "SEGMENTS(CURVE=";J+1;") = ";YESNO$(SEGMENTS(J))
  1023.    NEXT J
  1024.    RETURN
  1025.  END IF
  1026.  
  1027.  IF FIRST=NO THEN GOTO OPTIONERR
  1028.  
  1029.  IF OPTLINE$=LEFT$("SCALE",LO) THEN
  1030.    IF OPTIONVAL$=LEFT$("AUTO",LOV) THEN
  1031.      SCALE$="AUTO"
  1032.      NUMOPTS=NUMOPTS+1
  1033.    ELSEIF OPTIONVAL$=LEFT$("MANUAL",LOV) THEN
  1034.      SCALE$="MANUAL"
  1035.      NUMOPTS=NUMOPTS+1
  1036.    ELSE
  1037.      GOTO OPTIONERR
  1038.    END IF
  1039.    RETURN
  1040.  END IF
  1041.  
  1042.  IF OPTLINE$=LEFT$("XAXIS",LO) THEN
  1043.    IF OPTIONVAL$=LEFT$("LINEAR",LOV) THEN
  1044.      AXISTYPE$(X)="LINEAR"
  1045.      LEXP$(X)=""
  1046.      NUMOPTS=NUMOPTS+1
  1047.    ELSEIF OPTIONVAL$=LEFT$("LOGARITHMIC",LOV) THEN
  1048.      AXISTYPE$(X)="LOG"
  1049.      LEXP$(X)="10^"
  1050.      NUMOPTS=NUMOPTS+1
  1051.    ELSE
  1052.      GOTO OPTIONERR
  1053.    END IF
  1054.    RETURN
  1055.  END IF
  1056.  
  1057.  IF OPTLINE$=LEFT$("YAXIS",LO) THEN
  1058.    IF OPTIONVAL$=LEFT$("LINEAR",LOV) THEN
  1059.      AXISTYPE$(Y)="LINEAR"
  1060.      LEXP$(Y)=""
  1061.      NUMOPTS=NUMOPTS+1
  1062.    ELSEIF OPTIONVAL$=LEFT$("LOGARITHMIC",LOV) THEN
  1063.      AXISTYPE$(Y)="LOG"
  1064.      LEXP$(Y)="10^"
  1065.      NUMOPTS=NUMOPTS+1
  1066.    ELSE
  1067.      GOTO OPTIONERR
  1068.    END IF
  1069.    RETURN
  1070.  END IF
  1071.  
  1072.  IF OPTLINE$=LEFT$("XMINIMUM",LO) THEN
  1073.    MINVAL(X)=VAL(OPTIONVAL$)
  1074.    NUMOPTS=NUMOPTS+1
  1075.    RETURN
  1076.  END IF
  1077.  
  1078.  IF OPTLINE$=LEFT$("YMINIMUM",LO) THEN
  1079.    MINVAL(Y)=VAL(OPTIONVAL$)
  1080.    NUMOPTS=NUMOPTS+1
  1081.    RETURN
  1082.  END IF
  1083.  
  1084.  IF OPTLINE$=LEFT$("XMAXIMUM",LO) THEN
  1085.    MAXVAL(X)=VAL(OPTIONVAL$)
  1086.    NUMOPTS=NUMOPTS+1
  1087.    RETURN
  1088.  END IF
  1089.  
  1090.  IF OPTLINE$=LEFT$("YMAXIMUM",LO) THEN
  1091.    MAXVAL(Y)=VAL(OPTIONVAL$)
  1092.    NUMOPTS=NUMOPTS+1
  1093.    RETURN
  1094.  END IF
  1095.  
  1096. ' IF OPTLINE$=LEFT$("SCREEN",LO) THEN       'FOR IBM
  1097. '   IF OPTIONVAL$=LEFT$("LOW",LOV) THEN
  1098. '     GMODE$="LOW, 320 X 200"
  1099. '     SCRMODE=1
  1100. '     YFACTOR=1
  1101. '     XFACTOR=.5
  1102. '     NUMOPTS=NUMOPTS+1
  1103. '   ELSEIF OPTIONVAL$=LEFT$("MEDIUM",LOV) THEN
  1104. '     GMODE$="MEDIUM, 640 X 200"
  1105. '     SCRMODE=2
  1106. '     YFACTOR=1
  1107. '     XFACTOR=1
  1108. '     NUMOPTS=NUMOPTS+1
  1109. '   ELSEIF OPTIONVAL$=LEFT$("HIGH",LOV) THEN
  1110. '     GMODE$="HIGH, 640 X 350"
  1111. '     SCRMODE=9
  1112. '     YFACTOR=1.75
  1113. '     XFACTOR=1
  1114. '     NUMOPTS=NUMOPTS+1
  1115. '   ELSE
  1116. '     GOTO OPTIONERR
  1117. '   END IF
  1118. '   RETURN
  1119. ' END IF
  1120.  
  1121.  IF INTERACTIVE=NO THEN GOTO OPTIONERR
  1122.  
  1123.  IF OPTLINE$=LEFT$("HELP",LO) THEN
  1124.    GOSUB PRINTHELP
  1125.    RETURN
  1126.  END IF
  1127.  
  1128.  IF OPTLINE$=LEFT$("RESET",LO) THEN
  1129.    GOSUB DEFAULTS
  1130.    RETURN
  1131.  END IF
  1132.  
  1133.  IF OPTLINE$=LEFT$("DEVICE",LO) THEN
  1134.    IF OPTIONVAL$=LEFT$("SCREEN",LOV) THEN
  1135.      DEVICE$="SCREEN"
  1136.      NUMOPTS=NUMOPTS+1
  1137.    ELSEIF OPTIONVAL$=LEFT$("PRINTER",LOV) THEN
  1138.      DEVICE$="PRINTER"
  1139.      NUMOPTS=NUMOPTS+1
  1140.    ELSE
  1141.      GOTO OPTIONERR
  1142.    END IF
  1143.    RETURN
  1144.  END IF
  1145.  
  1146. OPTIONERR:
  1147.  PRINT "UNPROCESSED OPTION!   ";OPTLINE$;
  1148.  IF OPTIONVAL$<>"" THEN PRINT "=" ;OPTIONVAL$ ELSE PRINT
  1149.  RETURN
  1150.  
  1151. TRIMSTR:                                
  1152.  WHILE LEFT$(PARM$,1)=" "
  1153.    PARM$=RIGHT$(PARM$,LEN(PARM$)-1)
  1154.  WEND
  1155.  WHILE RIGHT$(PARM$,1)=" "
  1156.    PARM$=LEFT$(PARM$,LEN(PARM$)-1)
  1157.  WEND
  1158.  RETURN
  1159.  
  1160.  
  1161. END  'END OF PROGRAM
  1162.  
  1163.